package com.yswy.common.utils;
import java.awt.image.BufferedImage;
import java.io.*;
import java.math.BigDecimal;

import javax.imageio.ImageIO;

import lombok.extern.slf4j.Slf4j;
import net.coobird.thumbnailator.Thumbnails;
import org.apache.commons.lang3.StringUtils;

/**
 * Created by hdwang on 2018/12/13.
 */
@Slf4j
public class PicUtils {

//    public static void main(String[] args) throws IOException {
////        String res = DownloadURLFile.downloadFromUrl("https://weigou-files.obs.cn-north-4.myhuaweicloud.com/xyGoodsPic/e71611ec41a5462e81d7ddf005d32207.jpg"
////                , "/Users/mac/Desktop/");
//        File file = new File("/Users/mac/Desktop/t0117c7f393b2d160a3.jpg");
//        String newFileName = "/Users/mac/Desktop/" + "ys"+file.getName();
//        File ysFile = new File(newFileName);
//
//        PicUtils.commpressPicForScale(file.getPath(),ysFile.getPath(), 1000, 0.9); // 图片小于1000kb
//
//
//    }

    /**
     * 根据指定大小和指定精度压缩图片
     *
     * @param srcPath
     *            源图片地址
     * @param desPath
     *            目标图片地址
     * @param desFileSize
     *            指定图片大小，单位kb
     * @param accuracy
     *            精度，递归压缩的比率，建议小于0.9
     *            ,int desMaxWidth目标最大宽度,int desMaxHeight目标最大高度
     * @return 目标文件路径
     */
    public static String commpressPicForScale(String srcPath, String desPath,
                                              long desFileSize, double accuracy) {
        if (StringUtils.isEmpty(srcPath) || StringUtils.isEmpty(srcPath)) {
            return null;
        }
        if (!new File(srcPath).exists()) {
            return null;
        }
        try {
            File srcFile = new File(srcPath);
            long srcFileSize = srcFile.length();
            log.info("源图片：" + srcPath + "，大小：" + srcFileSize / 1024
                    + "kb");
            //获取图片信息
            BufferedImage bim = ImageIO.read(srcFile);
            int srcWidth = bim.getWidth();
            int srcHeight = bim.getHeight();

            //先转换成jpg
            Thumbnails.Builder builder = Thumbnails.of(srcFile).outputFormat("jpg");

            // 指定大小（宽或高超出会才会被缩放）
//            if(srcWidth > desMaxWidth || srcHeight > desMaxHeight) {
//                builder.size(desMaxWidth, desMaxHeight);
//            }else{
//                //宽高均小，指定原大小
//                builder.size(srcWidth,srcHeight);
//            }
            builder.size(srcWidth,srcHeight);

            // 写入到内存
            ByteArrayOutputStream baos = new ByteArrayOutputStream(); //字节输出流（写入到内存）
            builder.toOutputStream(baos);

            // 递归压缩，直到目标文件大小小于desFileSize
            byte[] bytes = commpressPicCycle(baos.toByteArray(), desFileSize, accuracy);

            // 输出到文件
            File desFile = new File(desPath);
            FileOutputStream fos = new FileOutputStream(desFile);
            fos.write(bytes);
            fos.close();

            log.info("目标图片：" + desPath + "，大小" + desFile.length() / 1024 + "kb");
            log.info("图片压缩完成！");
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return desPath;
    }

    private static byte[] commpressPicCycle(byte[] bytes, long desFileSize, double accuracy) throws IOException {
        // File srcFileJPG = new File(desPath);
        long srcFileSizeJPG = bytes.length;
        // 2、判断大小，如果小于500kb，不压缩；如果大于等于500kb，压缩
        if (srcFileSizeJPG <= desFileSize * 1024) {
            return bytes;
        }
        // 计算宽高
        BufferedImage bim = ImageIO.read(new ByteArrayInputStream(bytes));
        int srcWdith = bim.getWidth();
        int srcHeigth = bim.getHeight();
        int desWidth = new BigDecimal(srcWdith).multiply(
                new BigDecimal(accuracy)).intValue();
        int desHeight = new BigDecimal(srcHeigth).multiply(
                new BigDecimal(accuracy)).intValue();

        ByteArrayOutputStream baos = new ByteArrayOutputStream(); //字节输出流（写入到内存）
        Thumbnails.of(new ByteArrayInputStream(bytes)).size(desWidth, desHeight).outputQuality(accuracy).toOutputStream(baos);
        return commpressPicCycle(baos.toByteArray(), desFileSize, accuracy);
    }

}